package main

import (
	"fmt"
	"runtime"
)

func main() {
	go func(s string) {
		for i := 0; i < 2; i++ {
			fmt.Println(s)
		}
	}("world")

	// 主协程
	for i := 0; i < 2; i++ {
		runtime.Gosched()    //主协程释放CPU时间片，此时上面的协程得以执行
		fmt.Println("hello") //CPU时间片回来后继续执行
	}
	//time.Sleep(time.Second)
}

/**
两种结果：
①
hello
world
hello
world
第一个结果解释：进入主协程的第一轮 for 循环，主协程让出CPU时间片时，上面的协程还没创建好，
因此没有其他协程可以使用时间片，那么主协程继续执行，先打印了hello。进入主协程的第二轮 for 循环，
主协程让出CPU时间片时，上面的协程打印了world，然后主协程又得到时间片打印了hello，在主协程结束进程之前，
上面的协程打印了world。


②
world
world
hello
hello

第二个结果解释：进入主协程的第一轮 for 循环，主协程让出CPU时间片时，上面的协程已经创建好，
并打印了两个world，然后主协程继续执行，打印了一个hello。进入主协程的第二轮 for 循环，
主协程让出CPU时间片时，已经没有协程正在等待执行，所以主协程继续打印了一个hello，然后结束。

*/
